#include<stdio.h>
#define TRUE 1
#define FALSE 0
#define maxsize 100

typedef struct SeqStack
{
	char elem[maxsize];
	int top;
}SeqStack;//顺序栈的定义

//栈的初始化
void initStack(SeqStack* s) {
	s->top = -1;
}

int isEmpty(SeqStack s) {
	if (s.top == -1) return TRUE;
	return FALSE;
}

int isFull(SeqStack s) {
	if (s.top == maxsize - 1) return TRUE;
	return FALSE;
}

int push(SeqStack* s, char c) {
	if (isFull(*s)) return FALSE;
	s->top++;
	s->elem[s->top] = c;
	return TRUE;
}

int pop(SeqStack* s, char* c) {
	if (isEmpty(*s)) return FALSE;
	*c = s->elem[s->top];
	s->top--;
	return TRUE;
}

//判断是否匹配
int match(char ch, char charFromStack) {
	if (ch == ')' && charFromStack == '(')return TRUE;
	if (ch == ']' && charFromStack == '[')return TRUE;
	if (ch == '}' && charFromStack == '{')return TRUE;
	return FALSE;
}

int bracketmatch(char* str) {
	char ch;//用于读取每一位的具体字符
	SeqStack s;//创建栈
	char charFormStack;//用于存储从栈中获取的数值

	initStack(&s);
	//逐步读取字符，逐个进行判断
	//如果是左括号就入栈，如果是右括号就出栈一个字符并判断是否匹配(当然入栈时候要判断栈是否已经满了，出栈要看是否是空栈)
	while (*str != '\0')
	{
		ch = *str;
		if (ch == '(' || ch == '[' || ch == '{') push(&s, ch);
		if (ch == ')' || ch == ']' || ch == '}') {
			//两个功能:如果返回为TRUE说明操作正常进行,FALSE则是出错了,在最外层返回FALSE
			if (pop(&s, &charFormStack)) {
				//匹配成功进入下一次循环，失败就返回FALSE;
				if (match(ch, charFormStack)) {
					goto a;
				}

			}
			return FALSE;
		}
	a:
		str++;//指针后移
		
	}
	//若栈没有空，说明右括号多了，返回FALSE
	if (!isEmpty(s)) return FALSE; 

	return TRUE;
}

int main(int argc, char* argv[])
{
	const char* str = "(1+5)*6 + ({3-5 + [5*9] +4}-6)";
	const char* str1 = "(1+5)*6 + ({3-5 + [5*9] +4}-6)}";
	if (bracketmatch((char *)str))
		printf("str bracket match OK!\n");
	else
		printf("str bracket match ERROR!\n");

	if (bracketmatch((char *)str1))
		printf("str1 bracket match OK!\n");
	else
		printf("str1 bracket match ERROR!\n");

	return 0;
}

/*
设计一个函数
	int bracketmatch(char *str)
该函数的功能判断由str字符串所给出的表达式里圆括号、方括号、花括号是否合法，也就是左右匹配。对其它字符不做任何处理。
(1+35))  不合法
[3]+{444}-[(333)]合法。
{1+[233}-]不合法
合法返回1，不合法返回0


如下的main函数执行后
int main(int argc, char* argv[])
{
	char *str="(1+5)*6 + ({3-5 + [5*9] +4}-6)";
	char *str1="(1+5)*6 + ({3-5 + [5*9] +4}-6)}";
	if(bracketmatch(str))
		printf("str bracket match OK!\n");
	else
		printf("str bracket match ERROR!\n");

	if(bracketmatch(str1))
		printf("str1 bracket match OK!\n");
	else
		printf("str1 bracket match ERROR!\n");

	return 0;
}
执行的结果为
str bracket match OK!
str1 bracket match ERROR!
*/